#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//int main()
//{
//	int aa[2][5] = { 10,9,8,7,6,5,4,3,2,1 };
//	int* ptr1 = (int*)(&aa + 1);
//	int* ptr2 = (int*)(*(aa + 1));
//	printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
//	return 0;
//}

//int main()
//{
//    int row = 0;
//    int col = 0;
//    scanf("%d %d", &row, &col);
//    getchar();
//
//    int arr[10][10] = { 0 };
//    int i = 0;
//    int j = 0;
//    for (i = 0; i < row; i++)
//    {
//        for (j = 0; j < col; j++)
//        {
//            scanf("%d", &arr[i][j]);
//            getchar();
//        }
//    }
//    for (i = 0; i < col; i++)
//    {
//        for (j = 0; j < row; j++)
//        {
//            printf("%d ", arr[j][i]);
//        }
//        printf("\n");
//    }
//
//    return 0;
//}
#include<string.h>
//void revolve(char* arr, int r, int i)
//{
//	int a = 0;
//	for (a = 0; a < i; a++)
//	{
//		char tmp = *arr;
//
//	}
//}
//
//int main()
//{
//	char arr[] = "AABCD";
//	int i = 0;
//	scanf("%d ", &i);
//	int r = strlen(arr);
//
//	revolve(arr, r, i);
//
//
//	return 0;
//int main()
//{
//    int n = 0;
//    scanf("%d ", &n);
//        int arr[11][11] = { 0 };
//
//    int i = 0;
//    int j = 0;
//    for (i = 0; i < n; i++)
//    {
//        for (j = 0; j < n; j++)
//        {
//            scanf("%d ", &arr[i][j]);
//        }
//    }
//
//
//
//    return 0;
//}

#include<assert.h>
//实现memcpy函数
//void* my_memcpy(void* dest, const void* src, size_t num)//全部改为void*这样可以用到任何数中
//{
//	assert(dest && src);
//	void* ret = dest;
//	while (num--)
//	{
//		*(char*)dest = *(char*)src;//强转为char*，这样无论num是什么数都可以计算
//		dest = (char*)dest + 1;//转为下一个
//		src = (char*)src + 1;
//	}
//	return ret;
//}
//int main()
//{
//	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
//	int arr1[20] = { 0 };
//	my_memcpy(arr1, arr, 12);
//	int i = 0;
//	for (i = 0; i < 3; i++)
//	{
//		printf("%d ", arr1[i]);
//	}
//	return 0;
//}

//实现memmove
//void* my_memmove(void* dest, const void* src, size_t num)
//{
//	assert(dest && src);
//	void* ret = dest;
//	if (dest < src)//dest小与src，src从前向后
//	{
//		while (num--)
//		{
//			*(char*)dest = *(char*)src;
//			dest = (char*)dest + 1;
//			src = (char*)src + 1;
//		}
//	}
//	else
//	{
//		while (num--)
//		{
//			*((char*)dest + num) = *((char*)src + num);
//		}
//	}
//	return ret;
//}
//void test()
//{
//	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//	my_memmove(arr + 2, arr, 20);
//
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//int main()
//{
//	test();
//	return 0;
//}
//字符串旋转
//int revolve(char arr1[], char arr2[])
//{
//	int len = strlen(arr1);
//	int i = 0;
//
//	for (i = 0; i < len; i++)
//	{
//		char tmp = arr1[0];
//		for (int j = 0; j < len - 1; j++)
//		{
//			arr1[j] = arr1[j + 1];
//		}
//		arr1[len - 1] = tmp;
//		if (strcmp(arr2, arr1))
//		{
//			return 1;
//		}
//	}
//	return 0;
//}
//int main()
//{
//	char arr1[] = "AABCD";
//	char arr2[] = "BCDAA";
//
//	int ret = revolve(arr1, arr2);
//	printf("%d\n", ret);
//
//
//	return 0;
//}
//模拟实现strlen函数
//int my_strlen(const char* arr)
//{
//	int count = 0;
//	while (*arr != 0)
//	{
//		*arr++;
//		count++;
//	}
//	return count;
//}
//
//int main()
//{
//	char arr[] = "abcdef";
//
//	int ret = my_strlen(arr);
//
//	printf("%d\n", ret);
//
//	return 0;
//}

//模拟实现strcpy函数
#include<assert.h>;
//char* my_strcpy(char* arr1, const char* arr)
//{
//	assert(arr != NULL);
//	char* tmp = arr1;
//	while (*arr1++ = *arr++)
//	{
//	  ;
//	}
//	return tmp;
//}
//int main()
//{
//	char arr[] = "Fuel the future";
//	char arr1[20];
//	my_strcpy(arr1, arr);
//	printf("arr= %s\narr1= %s\n", arr, arr1);
//	return 0;
//}


////模拟实现strcat
//#include<stdlib.h>
//char* my_strcat(char* dest,const char* str)
//{
//	assert(dest && str);
//	char* ret = dest;
//	while (*dest)
//	{
//		dest++;
//	}
//	while (*dest++ = *str++)
//	{
//		;
//	}
//	*dest = *str;//把\0赋在最后
//	return ret;
//}
//
//int main()
//{
//	char arr[20] = "Fuel";
//	char arr1[20] = " the future ";
//	my_strcat(arr,arr1);
//	
//	printf("%s\n", arr);
//	system("pause");
//	return 0;
//
//}
//
//

//class Solution {
//public:
//    void replaceSpace(char* str, int length) {
//        char tmp = *str;
//        while (tmp < length)
//        {
//            if (tmp != ' ')
//            {
//                tmp++;
//            }
//
//            tmp = '%20';
//
//        }
//
//    }
//};
 
#include<stdlib.h>
//qsort排序整型数组
//int cmp(const void* e1, const void* e2)
//{
//	return (*(int*)e1 - *(int*)e2);//qsort默认升序
//}
//int main()
//{
//	int arr[] = { 0,1,9,3,4,5,6,7,8,2 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, sz, sizeof(arr[0]), cmp);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}

//排序结构体
//struct Stu
//{
//	char name[20];
//	int age;
//};
//int cpm(const void* e1, const void* e2)
//{
//	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);//按名字排序是int不用要strcmp
//}
//int main()
//{
//	struct Stu s[] = {{"zhangsan",20},{"lisi",45},{"wangwu",10}};
//	int sz = sizeof(s) / sizeof(s[0]);
//	qsort(s, sz, sizeof(s[0]), cpm);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%s%d ", s[i].name, s[i].age);
//	}
//	return 0;
//}


//模拟qsort实现冒泡排序
int cmpar(const void* e1, const void* e2)
{
	return (*(int*)e1 - *(int*)e2);
}
void Swap(char* e1, char* e2, int num)
{
	int i = 0;
	for (i = 0; i < num; i++)
	{
		char tmp = *e1;
		*e1 = *e2;
		*e2 = tmp;
		*e1++;
		*e2++;
	}
}
void my_qsort(void* base, size_t sz, size_t size, int(*cmpar)(const void* e1, const void* e2))
{
	int i = 0;
	for (i = 0; i < sz; i++)//冒泡排序的趟数
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)//一趟过程
		{
			if (cmpar((char*)base + j * size, (char*)base + (j + 1) * size)>0)//判断,返回大于0的数，要交换变成升序
			{
				Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}
	}
}
int main()
{
	int arr[] = { 1,0,2,9,5,4,6,3,7,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	my_qsort(arr, sz, sizeof(arr[0]), cmpar);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}